package domaci3.model;

import java.util.Vector;


/**
 * Klasa koja reprezentuje dvostruko spregnutu listu
 * @author Ilija
 * @version 1.0
 */
public class DvostrukoSpregnutaLista {
    
    private Cvor prvi;
    private Cvor poslednji;
    private int brojCvorova;

    public DvostrukoSpregnutaLista() {
        prvi = null;
        poslednji = null;
        brojCvorova = 0;
    }
    
    /**
     * Proverava da li je lista prazna
     * @return true ako jeste
     */
    public boolean daLiJeListaPrazna(){
        return brojCvorova==0;
    }
    
    /**
     * Ubacuje novi cvor u dvostruko spregnutu listu
     * @param novi Cvor koji treba ubaciti
     * @return true ako je ubacen kako treba
     */
    
    public boolean ubaci(Cvor novi){
        if (daLiJeListaPrazna()){
            prvi = novi;
            poslednji = novi;
            novi.setPrethodni(null);
            novi.setSledeci(null);
            brojCvorova++;
            return true;
        } else {
            novi.setSledeci(null);
            novi.setPrethodni(poslednji);
            poslednji.setSledeci(novi);
            poslednji = novi;
            brojCvorova++;
            return true;
        }
    }
    
    /**
     * Poziva odgovarajuce metode za sve cvorove ih prikazuju
     */
    
    public Vector prikaziSve(){
        Vector vrati = new Vector();
        if (brojCvorova == 0){
            System.out.println("Lista je prazna");
        } else {
            System.out.println("U drugi krug prosli su sledeci kandidati. Molimo ih da se predstave: \n");
            Cvor pomocni = prvi;
            pomocni.prikazi();
            vrati.add(pomocni.prikazi());
            while (pomocni.getSledeci() != null){
                pomocni = pomocni.getSledeci();
                pomocni.prikazi();
                vrati.add(pomocni.prikazi());
            }
        }
        return vrati;
    }
    
    
    /**
     * Metoda koja izbacuje iz dvostruko spregnute liste cvor koji vise nije potreban
     * @param skart cvor koji nam ne treba vise
     * @return true ako je uspesno izbacen cvor
     */
    
    public boolean izbaci(Cvor skart){
//        Cvor prethodnik = skart.getPrethodni();
//        Cvor sledbenik = skart.getSledeci();
//        if (prethodnik == null){
//            prvi = sledbenik;
//        } else {
//            prethodnik.setSledeci(sledbenik);
//        }
//        if (sledbenik == null){
//            poslednji = prethodnik;
//        } else {
//            sledbenik.setPrethodni(prethodnik);           
//        }
//
//        skart=null;
//        brojCvorova--;
//        return true;
        if (brojCvorova == 0){
            System.out.println("Lista je prazna, ne moze se izbaciti nepostojeci Cvor!");
            return false;
        }
        if (brojCvorova == 1){
            setPrvi(null);
            setPoslednji(null);
            brojCvorova--;
            return true;
        }
        else {
            Cvor prethodnik  = skart.getPrethodni();
            Cvor sledbenik = skart.getSledeci();
            if (prethodnik == null){
                setPrvi(prvi.getSledeci());
                sledbenik.setPrethodni(null);
                skart.setSledeci(null);
                return true;
            }
            if (sledbenik == null){
                setPoslednji(poslednji.getPrethodni());
                skart.setPrethodni(null);
                prethodnik.setSledeci(null);
                return true;
            } else {
                prethodnik.setSledeci(sledbenik);
                sledbenik.setPrethodni(prethodnik);
                skart.setSledeci(null);
                skart.setPrethodni(null);
                return true;
            }
        }
        
    }
    
    
    
    /**
     * @return the prvi
     */
    public Cvor getPrvi() {
        return prvi;
    }

    /**
     * @param prvi the prvi to set
     */
    public void setPrvi(Cvor prvi) {
        this.prvi = prvi;
    }

    /**
     * @return the poslednji
     */
    public Cvor getPoslednji() {
        return poslednji;
    }

    /**
     * @param poslednji the poslednji to set
     */
    public void setPoslednji(Cvor poslednji) {
        this.poslednji = poslednji;
    }

    /**
     * @return the brojCvorova
     */
    public int getBrojCvorova() {
        return brojCvorova;
    }

    /**
     * @param brojCvorova the brojCvorova to set
     */
    public void setBrojCvorova(int brojCvorova) {
        this.brojCvorova = brojCvorova;
    }
    
    
    
}
